package lambda;

import org.junit.Test;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.function.Consumer;
import java.util.function.Function;
import java.util.function.Predicate;
import java.util.function.Supplier;

/**
 * java8四大核心函数式编程接口:
 *
 * 1.Consumer<T>：消费型接口
 *  代表了接受一个输入参数并且无返回的操作
 *  void accept(T t)
 *
 * 2.Supplier<T>:供给型接口
 *  无参数，返回一个结果。
 *  T get()
 *
 * 3.Function<T,R>:函数型接口
 * 接受一个输入参数，返回一个结果。
 * R apply(T t)
 *
 * 4.Predicate<T>:断言型接口
 * 接受一个输入参数，返回一个布尔值结果。
 * boolean test(T t)
 *
 */
public class LambdaTest {

    @Test
    public void consumerTest(){
        happy(10000, money -> System.out.println("我有" + money + "元，大宝剑花了2500元，还剩" + (money - 2500) + "元。"));
    }

    public void happy(Integer money, Consumer<Integer> con){
        con.accept(money);
    }

    @Test
    public void supplierTest(){
        List<Integer> list = getIntList(10, () -> (int) (Math.random() * 100));
        for (Integer i : list) {
            System.out.println(i);
        }
    }

    public List<Integer> getIntList(int num, Supplier<Integer> sup){
        List<Integer> list = new ArrayList<>();
        for (int i = 0; i < num; i++) {
            list.add(sup.get());
        }
        return list;
    }

    @Test
    public void functionTest(){
        System.out.println(strHandler("\t\t\t  zzy是坠吊的！   ", s -> s.trim()));
        System.out.println(strHandler("zzy是坠吊的！", s -> s.substring(0, 3)));
    }

    public String strHandler(String s, Function<String, String> func){
        return func.apply(s);
    }

    @Test
    public void predicateTest(){
        List<String> list = strFilter(Arrays.asList("Hello", "World", "!"), s -> s.contains("o"));
        for (String s : list
             ) {
            System.out.println(s);
        }
    }

    public List<String> strFilter(List<String> list, Predicate<String> pre){
        List<String> filterList = new ArrayList<>();
        for (String str : list) {
            if (pre.test(str)){
                filterList.add(str);
            }
        }
        return filterList;
    }
}
